/*
 * Copyright 2010 Michael Nitsche
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Lesser General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */

package de.mnit.basis.swt.dialog;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.MessageBox;
import org.eclipse.swt.widgets.Shell;

import de.mnit.basis.fehler.Fehler;
import de.mnit.basis.swt.element.A_SWT_Dialog2;
import de.mnit.basis.swt.element.steuer.rollbar.gruppe.bild.deko.S_Fenster;
import de.mnit.basis.sys.Ausgabe;



/**
 * TODO Unbedingt umbauen in richtigen Dialog der ein einzelnes Ergebnis zurück gibt!!!
 * TODO Es gibt noch: SWT.ABORT | SWT.RETRY | SWT.IGNORE
 * TODO Standard-Knopf festlegen. Geht aber derzeit mit SWT nicht. Evtl. eigenen Dialog basteln!
 */
public class SWT_Meldung extends A_SWT_Dialog2<SWT_Meldung, MessageBox> {

	private String text,titel="";
	private int icon=0, knopf=0;
	private Listener knopf_ja  =null;
	private Listener knopf_nein=null;
	private Listener knopf_ok  =null;
	private Listener knopf_abbr=null;


	public SWT_Meldung(String text) {
		this.text=text;
	}


	// FUNKTION

	public static SWT_Meldung neu(String text) {
		return new SWT_Meldung(text);
	}

	public static void schnell(String text) {
		new SWT_Meldung(text).oeffnen();
	}

	public SWT_Meldung sTyp_Warnung()   { this.iIcon(SWT.ICON_WARNING);     return this; }
	public SWT_Meldung sTyp_Hinweis()   { this.iIcon(SWT.ICON_INFORMATION); return this; }
	public SWT_Meldung sTyp_Frage()     { this.iIcon(SWT.ICON_QUESTION);    return this; }
	public SWT_Meldung sTyp_Fehler()    { this.iIcon(SWT.ICON_ERROR);       return this; }

	public SWT_Meldung sKnopf_Ja       (Listener s)   { this.knopf_ja   = iKnopf(SWT.YES   ,s); return this; }
	public SWT_Meldung sKnopf_Nein     (Listener s)   { this.knopf_nein = iKnopf(SWT.NO    ,s); return this; }
	public SWT_Meldung sKnopf_Abbrechen(Listener s)   { this.knopf_abbr = iKnopf(SWT.CANCEL,s); return this; }
	public SWT_Meldung sKnopf_Ok       (Listener s)   { this.knopf_ok   = iKnopf(SWT.OK    ,s); return this; }

	public void oeffnen() {
		oeffnen(true);
	}

	public void oeffnen(boolean warten) {
//		if(!(knopf_ja!=null || knopf_nein!=null || knopf_abbr!=null || knopf_ok!=null))
		Display display=Display.getDefault();
		Shell shell=display.getActiveShell();
		if(shell==null) {
			Shell[] shells=Display.getDefault().getShells();
			if(shells.length>0) shell=shells[0];
		}
		if(shell==null) {
			Ausgabe.fehler(text);
			Ausgabe.fehler("Keine Shell für Dialogfenster vorhanden!");
//			Fehler.sonstige.da_Untypisch("Keine Shell vorhanden!");
			return;
		}

		S_Fenster<?> fenster=(S_Fenster<?>)shell.getData();
		Fehler.objekt.wenn_Null(fenster);

		final Shell shellw=shell;
		if(warten) //Thread.sleep, Display.sleep und Schranke gehen hier nicht!
			iFensterOeffnen(shellw);
		else
			fenster.startAsync(new Runnable(){
				public void run() {
					try {
						iFensterOeffnen(shellw);
					}
					catch(Throwable t) {
						Fehler.zeig(t);
					}
				}
			});
	}

	// ERZEUGEN

	protected int style() {
		if(this.icon ==0)
			this.iIcon(SWT.ICON_INFORMATION);
//		if(this.knopf==0) this.i_Knopf(SWT.OK,null);
		return this.icon | this.knopf;
	}

	protected MessageBox roh(Shell vater, int style) {
		return new MessageBox((Shell)vater, style);
	}

	protected void init() {
		swt().setMessage(this.text );
		swt().setText   (this.titel);
	}

	// INTERN

	private void iIcon(int icon) {
		if(this.icon!=0)
			Fehler.sonstige.da_Untypisch("Typ wurde bereits gesetzt");
		this.icon=icon;
		if(icon==SWT.ICON_ERROR)       this.titel="Fehler";
		if(icon==SWT.ICON_INFORMATION) this.titel="Hinweis";
		if(icon==SWT.ICON_QUESTION)    this.titel="Frage";
		if(icon==SWT.ICON_WARNING)     this.titel="Warnung";
	}

	private Listener iKnopf(int typ, Listener neu) {
		if((knopf & typ)>0)
			Fehler.sonstige.da_Untypisch("Knopf wurde bereits gesetzt");
		this.knopf |= typ;
		return neu;
	}

	private void iFensterOeffnen(Shell shellw) {
		erzeugeSWT(shellw);
//		Ausgabe.debug(Display.getDefault().getActiveShell()==null, Display.getDefault().getShells().length);
		int erg=swt().open();
		if(erg==SWT.YES    && knopf_ja  !=null) knopf_ja.handleEvent(null); //this
		if(erg==SWT.NO     && knopf_nein!=null) knopf_nein.handleEvent(null); //this
		if(erg==SWT.CANCEL && knopf_abbr!=null) knopf_abbr.handleEvent(null); //this
		if(erg==SWT.OK     && knopf_ok  !=null) knopf_ok.handleEvent(null); //this
	}

}
